#include <iostream>

using namespace std;

// 因为数据范围是10万，而没一个数字转化成二进制位又可以变成31位，也就是0-30，所以点数应该是有310万
const int N = 3100010;
int n, m;
int nex[N][2], exist[N], idx;
int s[N];

// 字典树的操作
void insert(int x, int d) {
    int p = 0;
    for (int i = 30; i >= 0; --i) {
        // 这个地方就是得到二进制位的每一位的数是0还是1，记住就好了
        int c = x >> i & 1;
        if (!nex[p][c]) {
            nex[p][c] = ++idx;
        }
        p = nex[p][c];
        exist[p] += d;
    }
}

int find(int x) {
    int res = 0, p = 0;
    for (int i = 30; i >= 0; --i) {
        int c = x >> i & 1;
        if (exist[nex[p][!c]]) {
            p = nex[p][!c], res = res * 2 + 1;
        } else {
            p = nex[p][c], res *= 2;
        }
    }
    return res;
}

int main() {

    cin >> n >> m;
    // 定义前缀和数组
    for (int i = 1; i <= n; ++i) {
        int x;
        scanf("%d", &x);
        s[i] = s[i - 1] ^ x;
    }

    insert(s[0], 1);
    int res = 0;
    for (int i = 1; i <= n; ++i) {
        // 这个地方利用了一点滑动窗口的例子
        if (i - m - 1 >= 0) {
            insert(s[i - m - 1], -1);
        }
        res = max(res, find(s[i]));
        insert(s[i], 1);
    }
    cout << res;
    return 0;
}